fcntl() [system call]

파일 디스크립터 제어 및 상태 얻기
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
인자값을 받는 함수 안받는 함수 모두 있다.
cmd
F_DUPFD: 파일 디스크립터를 복사
F_GETFD: 파일 디스크립터의 close-on-exec(FD_CLOEXEC) 플래그 값을 리턴
F_SETFD: 파일 디스크립터의 플래그를 변경
F_GETFL: File table 엔트리의 상태 플래그를 반환
    open() 시에 사용된 플래그를 알 수 있다.
fcntl_test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int getflags(int fd){
int flags;
if((flags=fcntl(fd, F_GETFL))==-1)
{
perror("error");
return -1;
}
printf("file desciptor %d: ", fd);
switch(flags&O_ACCMODE)
{
case O_WRONLY:
printf("write-only");
break;
case O_RDONLY:
printf("read-only");
break;
case O_RDWR:
printf("read-write");
break
default:
printf("unknown access mode");
}
if(flags&O_APPEND)printf(", append");
if(flags&O_NONBLOCK)printf(", nonblock");
if(flags&O_SYNC)printf(", syschronous writes");
if(flags&O_ASYNC)printf(", asynchronous i/o");
putchar('\n');
return 0;
}
int main(void){
int fd;
int flags;
if((fd=open("README", O_WRONLY|O_NONBLOCK|O_ASYNC))==-1){
perror("error");
exit(1);
}
getflags(fd);
return 0;
}

csian@Csianui-MacBookPro linux % ./fcntl_test

file desciptor 3: write-only, nonblock, asynchronous i/o